#!usr/bin/env pyhon3

#第六章 数据编码和处理
import os

print(__file__)
print(os.path)
print(os.path.dirname(__file__))

#读取CSV文件

import csv

scriptUrl=os.path.dirname(__file__)

with open(os.path.join(scriptUrl,"asset","data.csv")) as f:
    f_csv = csv.reader(f) # 返回一个迭代器 每一行数据一个元素
    headers = next(f_csv)
    print(type(headers),headers,type(f_csv))
  
from collections import namedtuple

Row = namedtuple("Row",['a',"b"]) #初始化key

row=Row(1,2) # 对于key传入值

print(row)

#解释json
import json
from pprint import pprint

data = {
    "name":"Ace",
    "cname":"顶你肺",
    "age":21,
    "from":"zh_cn"
}
json_str = json.dumps(data,ensure_ascii=False) # 最后参数可以把中午正常转换
print(json_str)
jsonData = json.loads(json_str) # 把json字符串转换成dict
print(type(jsonData))
pprint(jsonData) #按照key的排序顺序输出
# 对应json文件用 json.dump json.load

#处理简单的XML
from xml.etree.ElementTree import parse,Element,tostring

xmlUrl = os.path.join(scriptUrl,"asset",'rssData.xml')

doc = parse(xmlUrl) #读取xml文件 注意参数必须是文件路径 或者文件句柄
print("doc=",doc) #得到 ElementTree 对象

items = doc.iterfind("channel/item") # 返回所有item节点的集合（生成器）
print(items) # Element 列表 （生成器）

#items = doc.find("channel/item") # 找到第一个item节点返回
#for item in items:
    #print(item.getchildren()) # 获取节点的子节点


#保存xml文件

assetUrl = os.path.join(scriptUrl,"asset")

ele = Element("data",{})
ele.text = "Hello world<span>"
xmlStr = tostring(ele) # bytes 类型的
print(type(xmlStr),xmlStr.decode())

# 修改xml
root = doc.getroot()

root.insert(1,ele) #在第三行插入一个元素

doc.write(os.path.join(assetUrl,"newData.xml"),xml_declaration=True) # xml_declaration 设置为True才会在文件开头添加xml版本信息

# 数据库操作  sqlite
import sqlite3

db = sqlite3.connect(os.path.join(assetUrl,"test.db")) #链接到数据库
c = db.cursor()

c.execute('create table IF NOT EXISTS user (id integer,name varchar(20))')

db.commit() #必须执行该操作才能真正提交到数据库

dbData = [(10,'tom'),(20,"jim")]

#c.executemany("insert into user values(?,?)",dbData) #插入数据
#db.commit()

rows=c.execute("select * from user where 1")

for row in rows:
    print(row,type(row))

#base64编码

import base64

# 主要是一些解码 编码函数

#struct 模块
import struct

# 8.12 6.12 读取嵌套和可变长二进制数据 P202-211 比较复杂迟点再看

'''
Pandas 是一个拥有很多特性的大型函数库，我在这里不可能介绍完。但是只要你
需要去分析大型数据集合、对数据分组、计算各种统计量或其他类似任务的话，这个
函数库真的值得你去看一看。

'''